// 第15节：索引:构造百万级数据
/* 
  引的性能提现必须要有大量数据才能看出来，你说你有10条20条数据，这是根本看不出来效果的，
  这节课就通过随机数的方法，创造出一个百万级数据的数据库出来。（建议收看视频学习）。
*/

// 制作随机数方法：
/* 
  我们要想生成一个百万级的数据集合，必须要有随机数的参与，我们需要写一个随机数的方法。下面的代码，创建了一个随机数方法。

  //生成随机数
  function GetRandomNum(min,max){
      let range = max-min;   //得到随机数区间
      let rand = Math.random(); //得到随机值
      return (min + Math.round(rand *range)); //最小值+随机数取整
  }
  console.log(GetRandomNum(10000,99999));
*/



// 制作随机用户名
/* 
  有了随机数的方法，我们就可以制作一个随机生成的用户名。目的是存在不同的用户名，方便我们测试查询速度。

  //生成随机数
    function GetRandomNum(min,max){
        let range = max-min;   //得到随机数区间
        let rand = Math.random(); //得到随机值
        return (min + Math.round(rand *range)); //最小值+随机数取整
    }
    //console.log(GetRandomNum(10000,99999));
    //生成随机用户名
    function GetRadomUserName(min,max){
        let tempStringArray= "123456789qwertyuiopasdfghjklzxcvbnm".split("");//构造生成时的字母库数组
        let outPuttext = ""; //最后输出的变量
        //进行循环，随机生产用户名的长度，这里需要生成随机数方法的配合
        for(let i=1 ;i<GetRandomNum(min,max);i++){
            //随机抽取字母，拼装成需要的用户名
            outPuttext=outPuttext+tempStringArray[GetRandomNum(0,tempStringArray.length)]
        }
        return outPuttext;
    }
    console.log(GetRadomUserName(7,16))
*/


// 插入200万数据
/* 
    有了生成随机数和随机用户名的方法，就可以生产百万级数据了。此处代码会在视频中作详细讲解。代码如下：

    var db = connect('company');
    db.randomInfo.drop();
    var  tempInfo = [];
    for (let i=0;i<2000000;i++){
        tempInfo.push({
            username:GetRadomUserName(7,16),
            regeditTime:new Date(),
            randNum0:GetRandomNum(100000,999999),
            randNum1:GetRandomNum(100000,999999),
            randNum2:GetRandomNum(100000,999999),
            randNum3:GetRandomNum(100000,999999),
            randNum4:GetRandomNum(100000,999999),
            randNum5:GetRandomNum(100000,999999),
            randNum6:GetRandomNum(100000,999999),
            randNum7:GetRandomNum(100000,999999),
            randNum8:GetRandomNum(100000,999999),
            randNum8:GetRandomNum(100000,999999),
        })
    }
    db.randomInfo.insert(tempInfo);

  // 这个过程可能2-3分钟，根据自己的电脑配置不同，会有差别。
*/

// 插入完成后，我们可以使用 db.randomInfo.stats() 这个命令查看数据中的数据条数。
// 或者db.randomInfo.stats().count 条数

// 全部代码：

//生成随机数
function GetRandomNum(min, max) {
  let range = max - min;   //得到随机数区间
  let rand = Math.random(); //得到随机值
  return (min + Math.round(rand * range)); //最小值+随机数取整
}
//console.log(GetRandomNum(10000,99999));
//生成随机用户名
function GetRadomUserName(min, max) {
  let tempStringArray = "123456789qwertyuiopasdfghjklzxcvbnm".split("");//构造生成时的字母库数组
  let outPuttext = ""; //最后输出的变量
  //进行循环，随机生产用户名的长度，这里需要生成随机数方法的配合
  for (let i = 1; i < GetRandomNum(min, max); i++) {
    //随机抽取字母，拼装成需要的用户名
    outPuttext = outPuttext + tempStringArray[GetRandomNum(0, tempStringArray.length)]
  }
  return outPuttext;
}
// console.log(GetRadomUserName(7,16))
var startTime=(new Date()).getTime();

var db = connect('demo15');
var tempInfo = [];
for (let i = 0; i < 2000000; i++) {
  tempInfo.push({
    username: GetRadomUserName(7, 16),
    regeditTime: new Date(),
    randNum0: GetRandomNum(100000, 999999),
    randNum1: GetRandomNum(100000, 999999),
    randNum2: GetRandomNum(100000, 999999),
    randNum3: GetRandomNum(100000, 999999),
    randNum4: GetRandomNum(100000, 999999),
    randNum5: GetRandomNum(100000, 999999),
    randNum6: GetRandomNum(100000, 999999),
    randNum7: GetRandomNum(100000, 999999),
    randNum8: GetRandomNum(100000, 999999),
    randNum8: GetRandomNum(100000, 999999),
  })
}
db.randomInfo.insert(tempInfo);
print('成功'+ (new Date()).getTime() - startTime + '时间')

/* 
  总结：这节课主要是为讲解MongoDB的索引作准备，我们用随机数的方法构建了一个百万级的数据表，如果你有兴趣继续往下学习联系，
  这节课必须动手作一下。以后这篇文章的学习全是基于这个代码。
*/